using UnityEngine;
using DLib.BehaviorTree;
using DLib.BehaviorTree.Tasks;
using System.Collections.Generic;

/// <summary>
/// 行为树演示脚本
/// 展示如何创建复杂的行为树结构
/// 包含选择器、序列、重复器等节点的使用
/// </summary>
public class BehaviorTreeDemo : MonoBehaviour
{
    /// <summary>行为树组件引用</summary>
    public BehaviorTree behaviorTree;
    
    /// <summary>是否显示调试信息</summary>
    public bool showDebugInfo = true;

    /// <summary>
    /// Unity Start方法
    /// 初始化行为树并创建复杂的演示树
    /// </summary>
    void Start()
    {
        // 创建行为树实例
        if (behaviorTree == null)
        {
            behaviorTree = new BehaviorTree();
        }

        // 创建演示行为树
        CreateDemoTree();
    }

    /// <summary>
    /// Unity Update方法
    /// 手动更新行为树并显示调试信息
    /// </summary>
    void Update()
    {
        // 手动更新行为树
        if (behaviorTree.isRunning && behaviorTree.root != null)
        {
            NodeState state = behaviorTree.root.Evaluate();
            
            if (state != NodeState.Running)
            {
                behaviorTree.isRunning = false;
                Debug.Log($"Behavior Tree completed with state: {state}");
            }
        }

        if (showDebugInfo)
        {
            // 显示当前状态
            if (behaviorTree.isRunning)
            {
                Debug.Log($"Behavior Tree State: {behaviorTree.GetCurrentState()}");
            }
        }
    }

    /// <summary>
    /// 创建演示行为树
    /// 展示复杂的行为树结构，包含多个分支和优先级
    /// </summary>
    void CreateDemoTree()
    {
        // 创建一个复杂的行为树示例
        // 根节点：选择器（OR逻辑）- 只要有一个分支成功就成功
        Selector rootSelector = new Selector();

        // 第一个分支：序列（AND逻辑）- 巡逻行为
        // 所有子节点都成功才执行完成
        Sequence patrolSequence = new Sequence();
        patrolSequence.AddChild(new LogTask("开始巡逻", 0.5f));
        patrolSequence.AddChild(new WaitTask(2f));
        patrolSequence.AddChild(new LogTask("巡逻完成", 0.5f));

        // 第二个分支：序列（AND逻辑）- 战斗行为
        Sequence combatSequence = new Sequence();
        combatSequence.AddChild(new LogTask("发现敌人", 0.5f));
        
        // 战斗子选择器 - 尝试不同的攻击方式
        Selector combatSelector = new Selector();
        combatSelector.AddChild(new LogTask("使用远程攻击", 1f));
        combatSelector.AddChild(new LogTask("使用近战攻击", 1f));
        combatSelector.AddChild(new LogTask("逃跑", 1f));
        
        combatSequence.AddChild(combatSelector);
        combatSequence.AddChild(new LogTask("战斗结束", 0.5f));

        // 第三个分支：重复行为 - 重复执行3次
        Repeater repeatBehavior = new Repeater(
            new Sequence(new List<Node> {
                new LogTask("重复行为", 0.3f),
                new WaitTask(1f)
            }), 3
        );

        // 添加所有分支到根选择器
        // 选择器会按优先级顺序尝试执行这些分支
        rootSelector.AddChild(patrolSequence);
        rootSelector.AddChild(combatSequence);
        rootSelector.AddChild(repeatBehavior);

        // 设置根节点
        behaviorTree.SetRoot(rootSelector);
    }

    /// <summary>
    /// Unity OnGUI方法
    /// 显示控制界面
    /// </summary>
    void OnGUI()
    {
        // 创建GUI区域
        GUILayout.BeginArea(new Rect(10, 10, 300, 200));
        
        // 显示标题
        GUILayout.Label("Behavior Tree Demo", GUI.skin.box);

        // 重置按钮
        if (GUILayout.Button("Reset Tree"))
        {
            behaviorTree.ResetTree();
        }

        // 停止按钮
        if (GUILayout.Button("Stop Tree"))
        {
            behaviorTree.StopTree();
        }

        // 开始按钮
        if (GUILayout.Button("Start Tree"))
        {
            behaviorTree.SetRoot(behaviorTree.root);
        }

        // 显示状态信息
        GUILayout.Label($"Status: {(behaviorTree.isRunning ? "Running" : "Stopped")}");
        GUILayout.Label($"State: {behaviorTree.GetCurrentState()}");

        // 结束GUI区域
        GUILayout.EndArea();
    }
} 